//#define _CRT_SECURE_NO_WARNINGS 1
//#include<iostream>
//#include<string>
//#include <cstring>
//using namespace std;
//int main()
//{
//    char str[201] = { 0 };
//    cin >> str;
//    int n;
//    cin >> n;
//    ;
//    //  n = 2;
//    while (n--)
//    {
//        char buf[201] = { 0 };
//        char inend[201] = { 0 };
//        char instd[201] = { 0 };
//        int std, end;
//        cin >> std >> end;
//        std--;
//        strncpy(buf, str + std, end - std);
//        strcpy(str + std, str + end);
//
//        cin >> instd >> inend;
//        int stdlen = strlen(instd);
//        strcpy(instd + stdlen, inend);
//        char* cha = strstr(str, instd);
//        if (cha)
//        {
//            cha += stdlen;
//            char tmp[201] = { 0 };
//
//            strcpy(tmp, cha);
//
//            strcpy(buf + strlen(buf), tmp);
//            strcpy(cha, buf);
//
//
//
//        }
//        else
//        {
//            strcpy(str + strlen(str), buf);
//        }
//
//
//
//    }
//    cout << str << endl;
//    return 0;
//}
#include<iostream>
using namespace std;
class stack
{
public:
    stack(int* a, int size, int top)
    {
        _a = (int*)malloc(sizeof(int) * size);
        _top = 0;
    }
    void Push(int k)
    {
        _a[_top] = k;
        _top++;
    }
    int Top()
    {
        if (_top == 0)
        {
            perror("_top == 0");
            exit(-1);
        }
        return _a[_top-1];
    }
    bool Empty()
    {
        return _top == 0;
    }
    void Destroy()
    {
        _top = 0;
    }
    void Pop()
    {
        if(!Empty())
        _top--;
    }
    int Size()
    {
        return _top;
    }
private:
    int* _a;
    int _top;
    int _size;
};
int main()
{
    int max = 0;
    int sum = 0;
    int n;
    cin >> n;
    stack st1(NULL, n, 0);
    stack st2(NULL, n, 0);
    for (int i = 0; i < n; i++)
    {

        int k;
        cin >> k;
        if (st1.Empty())
        {
            st1.Push(k);
        }
        else
        {
            if (k < st1.Top())
                st1.Push(k);
            else
            {
                if (st2.Empty() || (!st2.Empty() && st2.Top() < k))
                    st2.Push(k);
                else
                {
                    sum++;

                    int size = st1.Size();
                    if (size > max)
                    {
                        max = size;
                    }
                    st1.Destroy();
                    while (!st2.Empty()&&st2.Top() > k)
                    {
                        st1.Push(st2.Top());
                        st2.Pop();
                    }
                    st1.Push(k);
                }
            }

        }
    }
    if (!st1.Empty())
    {
        sum++;
        int size = st1.Size();
        if (size > max)
        {
            max = size;

        }
    }
    if (!st2.Empty())
    {
        sum++;
        int size =  st2.Size();
        if (size > max)
        {
            max = size;

        }
    }
    cout << sum << ' ' << max;
    return 0;
}